(ns utils.i18n-goog
  (:require
    [clojure.string :as string]
    goog.i18n.CompactNumberFormatSymbols
    goog.i18n.CompactNumberFormatSymbols_af
    goog.i18n.CompactNumberFormatSymbols_am
    goog.i18n.CompactNumberFormatSymbols_ar
    goog.i18n.CompactNumberFormatSymbols_ar_DZ
    goog.i18n.CompactNumberFormatSymbols_ar_EG
    goog.i18n.CompactNumberFormatSymbols_az
    goog.i18n.CompactNumberFormatSymbols_be
    goog.i18n.CompactNumberFormatSymbols_bg
    goog.i18n.CompactNumberFormatSymbols_bn
    goog.i18n.CompactNumberFormatSymbols_br
    goog.i18n.CompactNumberFormatSymbols_bs
    goog.i18n.CompactNumberFormatSymbols_ca
    goog.i18n.CompactNumberFormatSymbols_chr
    goog.i18n.CompactNumberFormatSymbols_cs
    goog.i18n.CompactNumberFormatSymbols_cy
    goog.i18n.CompactNumberFormatSymbols_da
    goog.i18n.CompactNumberFormatSymbols_de
    goog.i18n.CompactNumberFormatSymbols_de_AT
    goog.i18n.CompactNumberFormatSymbols_de_CH
    goog.i18n.CompactNumberFormatSymbols_el
    goog.i18n.CompactNumberFormatSymbols_en
    goog.i18n.CompactNumberFormatSymbols_en_AU
    goog.i18n.CompactNumberFormatSymbols_en_CA
    goog.i18n.CompactNumberFormatSymbols_en_GB
    goog.i18n.CompactNumberFormatSymbols_en_IE
    goog.i18n.CompactNumberFormatSymbols_en_IN
    goog.i18n.CompactNumberFormatSymbols_en_SG
    goog.i18n.CompactNumberFormatSymbols_en_US
    goog.i18n.CompactNumberFormatSymbols_en_ZA
    goog.i18n.CompactNumberFormatSymbols_es
    goog.i18n.CompactNumberFormatSymbols_es_419
    goog.i18n.CompactNumberFormatSymbols_es_ES
    goog.i18n.CompactNumberFormatSymbols_es_MX
    goog.i18n.CompactNumberFormatSymbols_es_US
    goog.i18n.CompactNumberFormatSymbols_et
    goog.i18n.CompactNumberFormatSymbols_eu
    goog.i18n.CompactNumberFormatSymbols_fa
    goog.i18n.CompactNumberFormatSymbols_fi
    goog.i18n.CompactNumberFormatSymbols_fil
    goog.i18n.CompactNumberFormatSymbols_fr
    goog.i18n.CompactNumberFormatSymbols_fr_CA
    goog.i18n.CompactNumberFormatSymbols_ga
    goog.i18n.CompactNumberFormatSymbols_gl
    goog.i18n.CompactNumberFormatSymbols_gsw
    goog.i18n.CompactNumberFormatSymbols_gu
    goog.i18n.CompactNumberFormatSymbols_haw
    goog.i18n.CompactNumberFormatSymbols_he
    goog.i18n.CompactNumberFormatSymbols_hi
    goog.i18n.CompactNumberFormatSymbols_hr
    goog.i18n.CompactNumberFormatSymbols_hu
    goog.i18n.CompactNumberFormatSymbols_hy
    goog.i18n.CompactNumberFormatSymbols_id
    goog.i18n.CompactNumberFormatSymbols_in
    goog.i18n.CompactNumberFormatSymbols_is
    goog.i18n.CompactNumberFormatSymbols_it
    goog.i18n.CompactNumberFormatSymbols_iw
    goog.i18n.CompactNumberFormatSymbols_ja
    goog.i18n.CompactNumberFormatSymbols_ka
    goog.i18n.CompactNumberFormatSymbols_kk
    goog.i18n.CompactNumberFormatSymbols_km
    goog.i18n.CompactNumberFormatSymbols_kn
    goog.i18n.CompactNumberFormatSymbols_ko
    goog.i18n.CompactNumberFormatSymbols_ky
    goog.i18n.CompactNumberFormatSymbols_ln
    goog.i18n.CompactNumberFormatSymbols_lo
    goog.i18n.CompactNumberFormatSymbols_lt
    goog.i18n.CompactNumberFormatSymbols_lv
    goog.i18n.CompactNumberFormatSymbols_mk
    goog.i18n.CompactNumberFormatSymbols_ml
    goog.i18n.CompactNumberFormatSymbols_mn
    goog.i18n.CompactNumberFormatSymbols_mo
    goog.i18n.CompactNumberFormatSymbols_mr
    goog.i18n.CompactNumberFormatSymbols_ms
    goog.i18n.CompactNumberFormatSymbols_mt
    goog.i18n.CompactNumberFormatSymbols_my
    goog.i18n.CompactNumberFormatSymbols_nb
    goog.i18n.CompactNumberFormatSymbols_ne
    goog.i18n.CompactNumberFormatSymbols_nl
    goog.i18n.CompactNumberFormatSymbols_no
    goog.i18n.CompactNumberFormatSymbols_no_NO
    goog.i18n.CompactNumberFormatSymbols_or
    goog.i18n.CompactNumberFormatSymbols_pa
    goog.i18n.CompactNumberFormatSymbols_pl
    goog.i18n.CompactNumberFormatSymbols_pt
    goog.i18n.CompactNumberFormatSymbols_pt_BR
    goog.i18n.CompactNumberFormatSymbols_pt_PT
    goog.i18n.CompactNumberFormatSymbols_ro
    goog.i18n.CompactNumberFormatSymbols_ru
    goog.i18n.CompactNumberFormatSymbols_sh
    goog.i18n.CompactNumberFormatSymbols_si
    goog.i18n.CompactNumberFormatSymbols_sk
    goog.i18n.CompactNumberFormatSymbols_sl
    goog.i18n.CompactNumberFormatSymbols_sq
    goog.i18n.CompactNumberFormatSymbols_sr
    goog.i18n.CompactNumberFormatSymbols_sr_Latn
    goog.i18n.CompactNumberFormatSymbols_sv
    goog.i18n.CompactNumberFormatSymbols_sw
    goog.i18n.CompactNumberFormatSymbols_ta
    goog.i18n.CompactNumberFormatSymbols_te
    goog.i18n.CompactNumberFormatSymbols_th
    goog.i18n.CompactNumberFormatSymbols_tl
    goog.i18n.CompactNumberFormatSymbols_tr
    goog.i18n.CompactNumberFormatSymbols_uk
    goog.i18n.CompactNumberFormatSymbols_ur
    goog.i18n.CompactNumberFormatSymbols_uz
    goog.i18n.CompactNumberFormatSymbols_vi
    goog.i18n.CompactNumberFormatSymbols_zh
    goog.i18n.CompactNumberFormatSymbols_zh_CN
    goog.i18n.CompactNumberFormatSymbols_zh_HK
    goog.i18n.CompactNumberFormatSymbols_zh_TW
    goog.i18n.CompactNumberFormatSymbols_zu
    goog.i18n.currency
    goog.i18n.DateTimeFormat
    goog.i18n.DateTimeFormat.Format
    goog.i18n.DateTimeSymbols
    goog.i18n.DateTimeSymbols_af
    goog.i18n.DateTimeSymbols_am
    goog.i18n.DateTimeSymbols_ar
    goog.i18n.DateTimeSymbols_ar_DZ
    goog.i18n.DateTimeSymbols_ar_EG
    goog.i18n.DateTimeSymbols_az
    goog.i18n.DateTimeSymbols_be
    goog.i18n.DateTimeSymbols_bg
    goog.i18n.DateTimeSymbols_bn
    goog.i18n.DateTimeSymbols_br
    goog.i18n.DateTimeSymbols_bs
    goog.i18n.DateTimeSymbols_ca
    goog.i18n.DateTimeSymbols_chr
    goog.i18n.DateTimeSymbols_cs
    goog.i18n.DateTimeSymbols_cy
    goog.i18n.DateTimeSymbols_da
    goog.i18n.DateTimeSymbols_de
    goog.i18n.DateTimeSymbols_de_AT
    goog.i18n.DateTimeSymbols_de_CH
    goog.i18n.DateTimeSymbols_el
    goog.i18n.DateTimeSymbols_en
    goog.i18n.DateTimeSymbols_en_AU
    goog.i18n.DateTimeSymbols_en_CA
    goog.i18n.DateTimeSymbols_en_GB
    goog.i18n.DateTimeSymbols_en_IE
    goog.i18n.DateTimeSymbols_en_IN
    goog.i18n.DateTimeSymbols_en_ISO
    goog.i18n.DateTimeSymbols_en_SG
    goog.i18n.DateTimeSymbols_en_US
    goog.i18n.DateTimeSymbols_en_ZA
    goog.i18n.DateTimeSymbols_es
    goog.i18n.DateTimeSymbols_es_419
    goog.i18n.DateTimeSymbols_es_ES
    goog.i18n.DateTimeSymbols_es_MX
    goog.i18n.DateTimeSymbols_es_US
    goog.i18n.DateTimeSymbols_et
    goog.i18n.DateTimeSymbols_eu
    goog.i18n.DateTimeSymbols_fa
    goog.i18n.DateTimeSymbols_fi
    goog.i18n.DateTimeSymbols_fil
    goog.i18n.DateTimeSymbols_fr
    goog.i18n.DateTimeSymbols_fr_CA
    goog.i18n.DateTimeSymbols_ga
    goog.i18n.DateTimeSymbols_gl
    goog.i18n.DateTimeSymbols_gsw
    goog.i18n.DateTimeSymbols_gu
    goog.i18n.DateTimeSymbols_haw
    goog.i18n.DateTimeSymbols_he
    goog.i18n.DateTimeSymbols_hi
    goog.i18n.DateTimeSymbols_hr
    goog.i18n.DateTimeSymbols_hu
    goog.i18n.DateTimeSymbols_hy
    goog.i18n.DateTimeSymbols_id
    goog.i18n.DateTimeSymbols_in
    goog.i18n.DateTimeSymbols_is
    goog.i18n.DateTimeSymbols_it
    goog.i18n.DateTimeSymbols_iw
    goog.i18n.DateTimeSymbols_ja
    goog.i18n.DateTimeSymbols_ka
    goog.i18n.DateTimeSymbols_kk
    goog.i18n.DateTimeSymbols_km
    goog.i18n.DateTimeSymbols_kn
    goog.i18n.DateTimeSymbols_ko
    goog.i18n.DateTimeSymbols_ky
    goog.i18n.DateTimeSymbols_ln
    goog.i18n.DateTimeSymbols_lo
    goog.i18n.DateTimeSymbols_lt
    goog.i18n.DateTimeSymbols_lv
    goog.i18n.DateTimeSymbols_mk
    goog.i18n.DateTimeSymbols_ml
    goog.i18n.DateTimeSymbols_mn
    goog.i18n.DateTimeSymbols_mo
    goog.i18n.DateTimeSymbols_mr
    goog.i18n.DateTimeSymbols_ms
    goog.i18n.DateTimeSymbols_mt
    goog.i18n.DateTimeSymbols_my
    goog.i18n.DateTimeSymbols_nb
    goog.i18n.DateTimeSymbols_ne
    goog.i18n.DateTimeSymbols_nl
    goog.i18n.DateTimeSymbols_no
    goog.i18n.DateTimeSymbols_no_NO
    goog.i18n.DateTimeSymbols_or
    goog.i18n.DateTimeSymbols_pa
    goog.i18n.DateTimeSymbols_pl
    goog.i18n.DateTimeSymbols_pt
    goog.i18n.DateTimeSymbols_pt_BR
    goog.i18n.DateTimeSymbols_pt_PT
    goog.i18n.DateTimeSymbols_ro
    goog.i18n.DateTimeSymbols_ru
    goog.i18n.DateTimeSymbols_sh
    goog.i18n.DateTimeSymbols_si
    goog.i18n.DateTimeSymbols_sk
    goog.i18n.DateTimeSymbols_sl
    goog.i18n.DateTimeSymbols_sq
    goog.i18n.DateTimeSymbols_sr
    goog.i18n.DateTimeSymbols_sr_Latn
    goog.i18n.DateTimeSymbols_sv
    goog.i18n.DateTimeSymbols_sw
    goog.i18n.DateTimeSymbols_ta
    goog.i18n.DateTimeSymbols_te
    goog.i18n.DateTimeSymbols_th
    goog.i18n.DateTimeSymbols_tl
    goog.i18n.DateTimeSymbols_tr
    goog.i18n.DateTimeSymbols_uk
    goog.i18n.DateTimeSymbols_ur
    goog.i18n.DateTimeSymbols_uz
    goog.i18n.DateTimeSymbols_vi
    goog.i18n.DateTimeSymbols_zh
    goog.i18n.DateTimeSymbols_zh_CN
    goog.i18n.DateTimeSymbols_zh_HK
    goog.i18n.DateTimeSymbols_zh_TW
    goog.i18n.DateTimeSymbols_zu
    goog.i18n.DateTimeSymbolsType
    goog.i18n.MessageFormat
    goog.i18n.NumberFormat
    goog.i18n.NumberFormat.CurrencyStyle
    goog.i18n.NumberFormat.Format
    goog.i18n.ordinalRules
    goog.i18n.pluralRules
    goog.i18n.TimeZone))

(def locales
  {"af"      ^js goog.i18n.DateTimeSymbols_af
   "am"      ^js goog.i18n.DateTimeSymbols_am
   "ar"      ^js goog.i18n.DateTimeSymbols_ar
   "ar_DZ"   ^js goog.i18n.DateTimeSymbols_ar_DZ
   "ar_EG"   ^js goog.i18n.DateTimeSymbols_ar_EG
   "az"      ^js goog.i18n.DateTimeSymbols_az
   "be"      ^js goog.i18n.DateTimeSymbols_be
   "bg"      ^js goog.i18n.DateTimeSymbols_bg
   "bn"      ^js goog.i18n.DateTimeSymbols_bn
   "br"      ^js goog.i18n.DateTimeSymbols_br
   "bs"      ^js goog.i18n.DateTimeSymbols_bs
   "ca"      ^js goog.i18n.DateTimeSymbols_ca
   "chr"     ^js goog.i18n.DateTimeSymbols_chr
   "cs"      ^js goog.i18n.DateTimeSymbols_cs
   "cy"      ^js goog.i18n.DateTimeSymbols_cy
   "da"      ^js goog.i18n.DateTimeSymbols_da
   "de"      ^js goog.i18n.DateTimeSymbols_de
   "de_AT"   ^js goog.i18n.DateTimeSymbols_de_AT
   "de_CH"   ^js goog.i18n.DateTimeSymbols_de_CH
   "el"      ^js goog.i18n.DateTimeSymbols_el
   "en"      ^js goog.i18n.DateTimeSymbols_en
   "en_AU"   ^js goog.i18n.DateTimeSymbols_en_AU
   "en_CA"   ^js goog.i18n.DateTimeSymbols_en_CA
   "en_GB"   ^js goog.i18n.DateTimeSymbols_en_GB
   "en_IE"   ^js goog.i18n.DateTimeSymbols_en_IE
   "en_IN"   ^js goog.i18n.DateTimeSymbols_en_IN
   "en_ISO"  ^js goog.i18n.DateTimeSymbols_en_ISO
   "en_SG"   ^js goog.i18n.DateTimeSymbols_en_SG
   "en_US"   ^js goog.i18n.DateTimeSymbols_en_US
   "en_ZA"   ^js goog.i18n.DateTimeSymbols_en_ZA
   "es"      ^js goog.i18n.DateTimeSymbols_es
   "es_419"  ^js goog.i18n.DateTimeSymbols_es_419
   "es_ES"   ^js goog.i18n.DateTimeSymbols_es_ES
   "es_MX"   ^js goog.i18n.DateTimeSymbols_es_MX
   "es_US"   ^js goog.i18n.DateTimeSymbols_es_US
   "et"      ^js goog.i18n.DateTimeSymbols_et
   "eu"      ^js goog.i18n.DateTimeSymbols_eu
   "fa"      ^js goog.i18n.DateTimeSymbols_fa
   "fi"      ^js goog.i18n.DateTimeSymbols_fi
   "fil"     ^js goog.i18n.DateTimeSymbols_fil
   "fr"      ^js goog.i18n.DateTimeSymbols_fr
   "fr_CA"   ^js goog.i18n.DateTimeSymbols_fr_CA
   "ga"      ^js goog.i18n.DateTimeSymbols_ga
   "gl"      ^js goog.i18n.DateTimeSymbols_gl
   "gsw"     ^js goog.i18n.DateTimeSymbols_gsw
   "gu"      ^js goog.i18n.DateTimeSymbols_gu
   "haw"     ^js goog.i18n.DateTimeSymbols_haw
   "he"      ^js goog.i18n.DateTimeSymbols_he
   "hi"      ^js goog.i18n.DateTimeSymbols_hi
   "hr"      ^js goog.i18n.DateTimeSymbols_hr
   "hu"      ^js goog.i18n.DateTimeSymbols_hu
   "hy"      ^js goog.i18n.DateTimeSymbols_hy
   "id"      ^js goog.i18n.DateTimeSymbols_id
   "in"      ^js goog.i18n.DateTimeSymbols_in
   "is"      ^js goog.i18n.DateTimeSymbols_is
   "it"      ^js goog.i18n.DateTimeSymbols_it
   "iw"      ^js goog.i18n.DateTimeSymbols_iw
   "ja"      ^js goog.i18n.DateTimeSymbols_ja
   "ka"      ^js goog.i18n.DateTimeSymbols_ka
   "kk"      ^js goog.i18n.DateTimeSymbols_kk
   "km"      ^js goog.i18n.DateTimeSymbols_km
   "kn"      ^js goog.i18n.DateTimeSymbols_kn
   "ko"      ^js goog.i18n.DateTimeSymbols_ko
   "ky"      ^js goog.i18n.DateTimeSymbols_ky
   "ln"      ^js goog.i18n.DateTimeSymbols_ln
   "lo"      ^js goog.i18n.DateTimeSymbols_lo
   "lt"      ^js goog.i18n.DateTimeSymbols_lt
   "lv"      ^js goog.i18n.DateTimeSymbols_lv
   "mk"      ^js goog.i18n.DateTimeSymbols_mk
   "ml"      ^js goog.i18n.DateTimeSymbols_ml
   "mn"      ^js goog.i18n.DateTimeSymbols_mn
   "mo"      ^js goog.i18n.DateTimeSymbols_mo
   "mr"      ^js goog.i18n.DateTimeSymbols_mr
   "ms"      ^js goog.i18n.DateTimeSymbols_ms
   "mt"      ^js goog.i18n.DateTimeSymbols_mt
   "my"      ^js goog.i18n.DateTimeSymbols_my
   "nb"      ^js goog.i18n.DateTimeSymbols_nb
   "ne"      ^js goog.i18n.DateTimeSymbols_ne
   "nl"      ^js goog.i18n.DateTimeSymbols_nl
   "no"      ^js goog.i18n.DateTimeSymbols_no
   "no_NO"   ^js goog.i18n.DateTimeSymbols_no_NO
   "or"      ^js goog.i18n.DateTimeSymbols_or
   "pa"      ^js goog.i18n.DateTimeSymbols_pa
   "pl"      ^js goog.i18n.DateTimeSymbols_pl
   "pt"      ^js goog.i18n.DateTimeSymbols_pt
   "pt_BR"   ^js goog.i18n.DateTimeSymbols_pt_BR
   "pt_PT"   ^js goog.i18n.DateTimeSymbols_pt_PT
   "ro"      ^js goog.i18n.DateTimeSymbols_ro
   "ru"      ^js goog.i18n.DateTimeSymbols_ru
   "sh"      ^js goog.i18n.DateTimeSymbols_sh
   "si"      ^js goog.i18n.DateTimeSymbols_si
   "sk"      ^js goog.i18n.DateTimeSymbols_sk
   "sl"      ^js goog.i18n.DateTimeSymbols_sl
   "sq"      ^js goog.i18n.DateTimeSymbols_sq
   "sr"      ^js goog.i18n.DateTimeSymbols_sr
   "sr_Latn" ^js goog.i18n.DateTimeSymbols_sr_Latn
   "sv"      ^js goog.i18n.DateTimeSymbols_sv
   "sw"      ^js goog.i18n.DateTimeSymbols_sw
   "ta"      ^js goog.i18n.DateTimeSymbols_ta
   "te"      ^js goog.i18n.DateTimeSymbols_te
   "th"      ^js goog.i18n.DateTimeSymbols_th
   "tl"      ^js goog.i18n.DateTimeSymbols_tl
   "tr"      ^js goog.i18n.DateTimeSymbols_tr
   "uk"      ^js goog.i18n.DateTimeSymbols_uk
   "ur"      ^js goog.i18n.DateTimeSymbols_ur
   "uz"      ^js goog.i18n.DateTimeSymbols_uz
   "vi"      ^js goog.i18n.DateTimeSymbols_vi
   "zh"      ^js goog.i18n.DateTimeSymbols_zh
   "zh_CN"   ^js goog.i18n.DateTimeSymbols_zh_CN
   "zh_HK"   ^js goog.i18n.DateTimeSymbols_zh_HK
   "zh_TW"   ^js goog.i18n.DateTimeSymbols_zh_TW
   "zu"      ^js goog.i18n.DateTimeSymbols_zu})

;; xx-YY locale, xx locale or en fallback
(defn locale-symbols
  [locale-name]
  (if-let [loc (get locales locale-name)]
    loc
    (let [name-first (string/replace (or locale-name "") #"-.*$" "")
          loc        (get locales name-first)]
      (or loc goog.i18n.DateTimeSymbols_en))))

;; get formatter for current locale symbols and format function
(defn mk-fmt
  [locale format-fn]
  (let [locsym (locale-symbols locale)]
    (goog.i18n.DateTimeFormat. (format-fn locsym) locsym)))
